#include "gpio.h"

PORT_GROUP gportin[GPIO_IN_COUNT] = {0};
PORT_GROUP gportout[GPIO_OUT_COUNT] = {0};

void InitgportList(void)
{

    gportin[IO_S1_HOME].port           = S1_HOME_GPIO_Port;
    gportin[IO_S1_HOME].pin            = S1_HOME_Pin;
    gportin[IO_S2_HOME].port           = S2_HOME_GPIO_Port;
    gportin[IO_S2_HOME].pin            = S2_HOME_Pin;

    gportin[IO_S3_HOME].port           = S3_HOME_GPIO_Port;
    gportin[IO_S3_HOME].pin            = S3_HOME_Pin;
    gportin[IO_S4_HOME].port           = S4_HOME_GPIO_Port;
    gportin[IO_S4_HOME].pin            = S4_HOME_Pin;

    gportin[IO_S1_LIMIT].port          = S1_LIMIT_GPIO_Port;
    gportin[IO_S1_LIMIT].pin           = S1_LIMIT_Pin;
    gportin[IO_S2_LIMIT].port          = S2_LIMIT_GPIO_Port;
    gportin[IO_S2_LIMIT].pin           = S2_LIMIT_Pin;
    gportin[IO_S3_LIMIT].port          = S3_LIMIT_GPIO_Port;
    gportin[IO_S3_LIMIT].pin           = S3_LIMIT_Pin;
    gportin[IO_S4_LIMIT].port          = S4_LIMIT_GPIO_Port;
    gportin[IO_S4_LIMIT].pin           = S4_LIMIT_Pin;

    gportin[IO_START_S1_PRESSED].port  = START_S1_PRESSED_GPIO_Port;
    gportin[IO_START_S1_PRESSED].pin   = START_S1_PRESSED_Pin;
    gportin[IO_START_S2_PRESSED].port  = START_S2_PRESSED_GPIO_Port;
    gportin[IO_START_S2_PRESSED].pin   = START_S2_PRESSED_Pin;
    gportin[IO_START_S3_PRESSED].port  = START_S3_PRESSED_GPIO_Port;
    gportin[IO_START_S3_PRESSED].pin   = START_S3_PRESSED_Pin;
    gportin[IO_START_S4_PRESSED].port  = START_S4_PRESSED_GPIO_Port;
    gportin[IO_START_S4_PRESSED].pin   = START_S4_PRESSED_Pin;
    gportin[IO_STOP_PRESSED].port      = STOP_PRESSED_GPIO_Port;
    gportin[IO_STOP_PRESSED].pin       = STOP_PRESSED_Pin;
    gportin[IO_SWITCH1].port           = SWITCH1_GPIO_Port;
    gportin[IO_SWITCH1].pin            = SWITCH1_Pin;
    gportin[IO_SWITCH2].port           = SWITCH2_GPIO_Port;
    gportin[IO_SWITCH2].pin            = SWITCH2_Pin;
    gportin[IO_SWITCH3].port           = SWITCH3_GPIO_Port;
    gportin[IO_SWITCH3].pin            = SWITCH3_Pin;
    gportin[IO_SWITCH4].port           = SWITCH4_GPIO_Port;
    gportin[IO_SWITCH4].pin            = SWITCH4_Pin;


    gportin[IO_S1_HOME].inverse = 1;
    gportin[IO_S2_HOME].inverse = 1;
    gportin[IO_S3_HOME].inverse = 1;
    gportin[IO_S4_HOME].inverse = 1;
    gportin[IO_S1_LIMIT].inverse = 1;
    gportin[IO_S2_LIMIT].inverse = 1;
    gportin[IO_S3_LIMIT].inverse = 1;
    gportin[IO_S4_LIMIT].inverse = 1;

    gportout[IO_S1_LOCK].port         = S1_LOCK_GPIO_Port;
    gportout[IO_S1_LOCK].pin          = S1_LOCK_Pin;
    gportout[IO_S1_CW].port           = S1_CW_GPIO_Port;
    gportout[IO_S1_CW].pin            = S1_CW_Pin;
    gportout[IO_S1_EN].port           = S1_EN_GPIO_Port;
    gportout[IO_S1_EN].pin            = S1_EN_Pin;
    gportout[IO_S2_LOCK].port         = S2_LOCK_GPIO_Port;
    gportout[IO_S2_LOCK].pin          = S2_LOCK_Pin;
    gportout[IO_S2_CW].port           = S2_CW_GPIO_Port;
    gportout[IO_S2_CW].pin            = S2_CW_Pin;
    gportout[IO_S2_EN].port           = S2_EN_GPIO_Port;
    gportout[IO_S2_EN].pin            = S2_EN_Pin;
    gportout[IO_S3_LOCK].port         = S3_LOCK_GPIO_Port;
    gportout[IO_S3_LOCK].pin          = S3_LOCK_Pin;
    gportout[IO_S3_CW].port           = S3_CW_GPIO_Port;
    gportout[IO_S3_CW].pin            = S3_CW_Pin;
    gportout[IO_S3_EN].port           = S3_EN_GPIO_Port;
    gportout[IO_S3_EN].pin            = S3_EN_Pin;
    gportout[IO_S4_LOCK].port         = S4_LOCK_GPIO_Port;
    gportout[IO_S4_LOCK].pin          = S4_LOCK_Pin;
    gportout[IO_S4_CW].port           = S4_CW_GPIO_Port;
    gportout[IO_S4_CW].pin            = S4_CW_Pin;
    gportout[IO_S4_EN].port           = S4_EN_GPIO_Port;
    gportout[IO_S4_EN].pin            = S4_EN_Pin;

    gportout[IO_V1].port              = V1_GPIO_Port;
    gportout[IO_V1].pin               = V1_Pin;
    gportout[IO_V2].port              = V2_GPIO_Port;
    gportout[IO_V2].pin               = V2_Pin;
    gportout[IO_V3].port              = V3_GPIO_Port;
    gportout[IO_V3].pin               = V3_Pin;
    gportout[IO_V4].port              = V4_GPIO_Port;
    gportout[IO_V4].pin               = V4_Pin;

    gportout[IO_STATELED].port        = LED_GPIO_Port;
    gportout[IO_STATELED].pin         = LED_Pin;
    gportout[IO_START_S1_LED].port    = START_S1_LED_GPIO_Port;
    gportout[IO_START_S1_LED].pin     = START_S1_LED_Pin;
    gportout[IO_START_S2_LED].port    = START_S2_LED_GPIO_Port;
    gportout[IO_START_S2_LED].pin     = START_S2_LED_Pin;
    gportout[IO_START_S3_LED].port    = START_S3_LED_GPIO_Port;
    gportout[IO_START_S3_LED].pin     = START_S3_LED_Pin;
    gportout[IO_START_S4_LED].port    = START_S4_LED_GPIO_Port;
    gportout[IO_START_S4_LED].pin     = START_S4_LED_Pin;

    gportout[IO_SPI_CS1].port         = SPICS1_GPIO_Port;
    gportout[IO_SPI_CS1].pin          = SPICS1_Pin;
    gportout[IO_SPI_CS2].port         = SPICS2_GPIO_Port;
    gportout[IO_SPI_CS2].pin          = SPICS2_Pin;
    gportout[IO_SPI_CS3].port         = SPICS3_GPIO_Port;
    gportout[IO_SPI_CS3].pin          = SPICS3_Pin;
    gportout[IO_SPI_CS4].port         = SPICS4_GPIO_Port;
    gportout[IO_SPI_CS4].pin          = SPICS4_Pin;

    gportout[IO_S1_EN].inverse = 1;
    gportout[IO_S2_EN].inverse = 1;
    gportout[IO_S3_EN].inverse = 1;
    gportout[IO_S4_EN].inverse = 1;

    gportout[IO_S1_CW].inverse = 0;
    gportout[IO_S2_CW].inverse = 0;
    gportout[IO_S3_CW].inverse = 0;
    gportout[IO_S4_CW].inverse = 1;
}

void MX_GPIO_Init(void)
{
    InitgportList();
  /* GPIO Ports Clock Enable */
    rcu_periph_clock_enable(RCU_GPIOH);
    rcu_periph_clock_enable(RCU_GPIOA);
    rcu_periph_clock_enable(RCU_GPIOC);
    rcu_periph_clock_enable(RCU_GPIOB);
    rcu_periph_clock_enable(RCU_GPIOD);
    rcu_periph_clock_enable(RCU_GPIOE);

    gpio_mode_set(gportin[IO_S1_HOME].port,  GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, gportin[IO_S1_HOME].pin);
    gpio_mode_set(gportin[IO_S2_HOME].port,  GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, gportin[IO_S2_HOME].pin);
    gpio_mode_set(gportin[IO_S3_HOME].port,  GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, gportin[IO_S3_HOME].pin);
    gpio_mode_set(gportin[IO_S4_HOME].port,  GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, gportin[IO_S4_HOME].pin);
    gpio_mode_set(gportin[IO_S1_LIMIT].port, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, gportin[IO_S1_LIMIT].pin);
    gpio_mode_set(gportin[IO_S2_LIMIT].port, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, gportin[IO_S2_LIMIT].pin);
    gpio_mode_set(gportin[IO_S3_LIMIT].port, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, gportin[IO_S3_LIMIT].pin);
    gpio_mode_set(gportin[IO_S4_LIMIT].port, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, gportin[IO_S4_LIMIT].pin);

    gpio_mode_set(gportin[IO_START_S1_PRESSED].port,  GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, gportin[IO_START_S1_PRESSED].pin);
    gpio_mode_set(gportin[IO_START_S2_PRESSED].port,  GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, gportin[IO_START_S2_PRESSED].pin);
    gpio_mode_set(gportin[IO_START_S3_PRESSED].port,  GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, gportin[IO_START_S3_PRESSED].pin);
    gpio_mode_set(gportin[IO_START_S4_PRESSED].port,  GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, gportin[IO_START_S4_PRESSED].pin);
    gpio_mode_set(gportin[IO_STOP_PRESSED].port,    GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, gportin[IO_STOP_PRESSED].pin);

    gpio_mode_set(gportin[IO_SWITCH1].port,        GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, gportin[IO_SWITCH1].pin);
    gpio_mode_set(gportin[IO_SWITCH2].port,        GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, gportin[IO_SWITCH2].pin);
    gpio_mode_set(gportin[IO_SWITCH3].port,        GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, gportin[IO_SWITCH3].pin);
    gpio_mode_set(gportin[IO_SWITCH4].port,        GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, gportin[IO_SWITCH4].pin);
    gpio_mode_set(gportin[IO_SWITCH5].port,        GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, gportin[IO_SWITCH5].pin);
    gpio_mode_set(gportin[IO_SWITCH6].port,        GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, gportin[IO_SWITCH6].pin);


    gpio_mode_set(gportout[IO_S1_LOCK].port, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,gportout[IO_S1_LOCK].pin);
    gpio_mode_set(gportout[IO_S2_LOCK].port, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,gportout[IO_S2_LOCK].pin);
    gpio_mode_set(gportout[IO_S3_LOCK].port, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,gportout[IO_S3_LOCK].pin);
    gpio_mode_set(gportout[IO_S4_LOCK].port, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,gportout[IO_S4_LOCK].pin);

    gpio_output_options_set(gportout[IO_S1_LOCK].port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,gportout[IO_S1_LOCK].pin);
    gpio_output_options_set(gportout[IO_S2_LOCK].port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,gportout[IO_S2_LOCK].pin);
    gpio_output_options_set(gportout[IO_S3_LOCK].port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,gportout[IO_S3_LOCK].pin);
    gpio_output_options_set(gportout[IO_S4_LOCK].port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,gportout[IO_S4_LOCK].pin);



    gpio_mode_set(gportout[IO_S1_CW].port, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,gportout[IO_S1_CW].pin);
    gpio_mode_set(gportout[IO_S2_CW].port, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,gportout[IO_S2_CW].pin);
    gpio_mode_set(gportout[IO_S3_CW].port, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,gportout[IO_S3_CW].pin);
    gpio_mode_set(gportout[IO_S4_CW].port, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,gportout[IO_S4_CW].pin);

    gpio_output_options_set(gportout[IO_S1_CW].port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,gportout[IO_S1_CW].pin);
    gpio_output_options_set(gportout[IO_S2_CW].port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,gportout[IO_S2_CW].pin);
    gpio_output_options_set(gportout[IO_S3_CW].port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,gportout[IO_S3_CW].pin);
    gpio_output_options_set(gportout[IO_S4_CW].port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,gportout[IO_S4_CW].pin);

    gpio_mode_set(gportout[IO_S1_EN].port, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,gportout[IO_S1_EN].pin);
    gpio_mode_set(gportout[IO_S2_EN].port, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,gportout[IO_S2_EN].pin);
    gpio_mode_set(gportout[IO_S3_EN].port, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,gportout[IO_S3_EN].pin);
    gpio_mode_set(gportout[IO_S4_EN].port, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,gportout[IO_S4_EN].pin);

    gpio_output_options_set(gportout[IO_S1_EN].port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,gportout[IO_S1_EN].pin);
    gpio_output_options_set(gportout[IO_S2_EN].port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,gportout[IO_S2_EN].pin);
    gpio_output_options_set(gportout[IO_S3_EN].port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,gportout[IO_S3_EN].pin);
    gpio_output_options_set(gportout[IO_S4_EN].port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,gportout[IO_S4_EN].pin);

    gpio_mode_set(gportout[IO_V1].port, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,gportout[IO_V1].pin);
    gpio_mode_set(gportout[IO_V2].port, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,gportout[IO_V2].pin);
    gpio_mode_set(gportout[IO_V3].port, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,gportout[IO_V3].pin);
    gpio_mode_set(gportout[IO_V4].port, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,gportout[IO_V4].pin);

    gpio_output_options_set(gportout[IO_V1].port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,gportout[IO_V1].pin);
    gpio_output_options_set(gportout[IO_V2].port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,gportout[IO_V2].pin);
    gpio_output_options_set(gportout[IO_V3].port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,gportout[IO_V3].pin);
    gpio_output_options_set(gportout[IO_V4].port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,gportout[IO_V4].pin);

    gpio_mode_set(gportout[IO_STATELED].port, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,gportout[IO_STATELED].pin);
    gpio_output_options_set(gportout[IO_STATELED].port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,gportout[IO_STATELED].pin);

    gpio_mode_set(gportout[IO_START_S1_LED].port, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,gportout[IO_START_S1_LED].pin);
    gpio_output_options_set(gportout[IO_START_S1_LED].port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,gportout[IO_START_S1_LED].pin);
    gpio_mode_set(gportout[IO_START_S2_LED].port, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,gportout[IO_START_S2_LED].pin);
    gpio_output_options_set(gportout[IO_START_S2_LED].port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,gportout[IO_START_S2_LED].pin);
    gpio_mode_set(gportout[IO_START_S3_LED].port, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,gportout[IO_START_S3_LED].pin);
    gpio_output_options_set(gportout[IO_START_S3_LED].port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,gportout[IO_START_S3_LED].pin);
    gpio_mode_set(gportout[IO_START_S4_LED].port, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,gportout[IO_START_S4_LED].pin);
    gpio_output_options_set(gportout[IO_START_S4_LED].port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,gportout[IO_START_S4_LED].pin);


    gpio_mode_set(gportout[IO_SPI_CS1].port, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,gportout[IO_SPI_CS1].pin);
    gpio_output_options_set(gportout[IO_SPI_CS1].port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,gportout[IO_SPI_CS1].pin);
    gpio_mode_set(gportout[IO_SPI_CS2].port, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,gportout[IO_SPI_CS2].pin);
    gpio_output_options_set(gportout[IO_SPI_CS2].port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,gportout[IO_SPI_CS2].pin);
    gpio_mode_set(gportout[IO_SPI_CS3].port, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,gportout[IO_SPI_CS3].pin);
    gpio_output_options_set(gportout[IO_SPI_CS3].port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,gportout[IO_SPI_CS3].pin);
    gpio_mode_set(gportout[IO_SPI_CS4].port, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,gportout[IO_SPI_CS4].pin);
    gpio_output_options_set(gportout[IO_SPI_CS4].port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,gportout[IO_SPI_CS4].pin);
}


